leetcode-49. 字母异位词分组
leetcode-49. 字母异位词分组
两种方法,都是把 key 聚合起来
func groupAnagrams(strs []string) [][]string {
mp := make(map[[26]int][]string)
for _, str := range strs {
var cCnt [26]int
for _, b := range str {
cCnt[b-'a'] ++
}
mp[cCnt] = append(mp[cCnt], str)
}
var ret [][]string
for _, m := range mp {
ret = append(ret, m)
}
return ret
}
2024-10-26 16:44
func groupAnagrams(strs []string) [][]string {
retMap := map[[26]byte][]string{}
for _, s := range strs {
var key [26]byte
for _, b := range []byte(s) {
key[b-97] ++
}
retMap[key] = append(retMap[key], s)
}
ret := [][]string{}
for _, r := range retMap {
ret = append(ret, r)
}
return ret
}
这两个版本的 groupAnagrams
函数基本实现相同,都是通过构造字母计数数组 key
来对字母异位词进行分组,但有一些细节上的优化空间:
-
变量类型优化:
- 第二个版本使用
[26]byte
而不是[26]int
作为key
的类型。byte
是uint8
的别名,占用更小的内存,在这种场景下是合理的选择,因为字母计数不会超过255
。 - 在性能上,
byte
数组的哈希处理可能稍微快一点,因为它是更小的数值类型。
- 第二个版本使用
-
字符索引转换:
- 第一版使用
cCnt[b-'a']
,而第二版使用key[b-97]
。两者在功能上是一样的,只是97
是'a'
的 ASCII 值,显式的97
有助于代码执行更直接的索引定位。 - 为了提升可读性,使用
'a'
可以更直观地说明这个值是为了计算字母位置。
- 第一版使用
-
初始化变量的方式:
- 第二个版本直接使用
map[...][]string{}
作为retMap
的初始化方式,写法上更简洁,减少了make
的调用。
- 第二个版本直接使用
-
结构一致性:
retMap
和ret
在两版代码中分别表示分组字典和结果容器。虽然功能一致,但如果你更喜欢语义化的命名,可以考虑更贴近业务逻辑的命名。
总的来说,这些修改带来了代码的更紧凑写法和微小的内存性能优化。
后面写的这一版明显比之前的要好很多了,而且写得很快
本站总访问量次 本站访客数人次 本文总阅读量次